
package com.dingwen.treasure.kettle.base.vo;


import cn.hutool.core.convert.Convert;
import cn.hutool.http.HttpStatus;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.api.R;
import com.dingwen.treasure.kettle.constant.SuppressWarningConstant;
import org.springframework.util.ObjectUtils;


/**
 * result 生成
 *
 * @author dingwen
 * @date 2021/06/29
 * @since 1.0.0-SNAPSHOT
 */
@SuppressWarnings(SuppressWarningConstant.ALL)
public class ResultGenerator {

    /**
     * 生成结果
     * 1.成功
     * 2.没有数据
     *
     * @return {@link Result}
     */
    public static <T> Result<T> genSuccessResult() {
        return (Result<T>) Result.builder().build();
    }

    /**
     * 生成结果: 仅仅返回消息
     * 1. 成功
     * 2. 消息
     *
     * @param message 消息
     * @return {@link Result}
     */
    public static <T> Result<T> genSuccessResultOnlyMessage(String message) {
        return (Result<T>) Result.builder().message(message).build();
    }


    /**
     * 生成结果
     * 1.成功
     * 2.数据
     * 3.数据为空显示查询结果为空提示
     *
     * @return {@link Result}
     */
    public static <T> Result<T> genSuccessResult(T data) {
        return (Result<T>) Result.builder()
                .data(data)
                .code(ObjectUtils.isEmpty(data) ? HttpStatus.HTTP_NO_CONTENT : HttpStatus.HTTP_OK)
                .message(ObjectUtils.isEmpty(data) ?
                        String.valueOf(HttpStatus.HTTP_NO_CONTENT) : String.valueOf(HttpStatus.HTTP_OK))
                .build();
    }

    /**
     * 生成结果
     * 1.成功
     * 2.数据
     * 3.消息
     *
     * @return {@link Result}
     */
    public static <T> Result<T> genSuccessResult(T data, String message) {
        return (Result<T>) Result.builder()
                .data(data)
                .code(ObjectUtils.isEmpty(data) ? HttpStatus.HTTP_NO_CONTENT : HttpStatus.HTTP_OK)
                .message(message)
                .build();
    }

    /**
     * 生成失败的结果
     * 1. 消息
     *
     * @param message 消息
     * @return {@link Result}
     */
    public static <T> Result<T> genFailureResult(String message) {
        return (Result<T>) Result.builder().message(message).code(HttpStatus.HTTP_INTERNAL_ERROR).build();
    }

    /**
     * 创失败结果
     *
     * @param message 消息
     * @param t       t
     * @return {@link Result}<{@link T}>
     */
    public static <T> Result<T> genFailureResult(String message, T t) {
        return (Result<T>) Result.builder().message(message).code(HttpStatus.HTTP_INTERNAL_ERROR)
                .data(t)
                .build();
    }


    /**
     * 生成失败的结果
     *
     * @return {@link Result}
     */
    public static <T> Result<T> genFailureResult() {
        return (Result<T>) Result.builder()
                .code(HttpStatus.HTTP_INTERNAL_ERROR)
                .message("fail")
                .build();
    }

    /**
     * 生成失败的结果
     * 1. 消息
     * 2. 状态码
     *
     * @param message    消息
     * @param httpStatus 结果代码
     * @return {@link Result}
     */
    public static <T> Result<T> genFailureResult(String message, Integer httpStatus) {
        return (Result<T>) Result.builder().message(message).code(httpStatus).build();
    }

    /**
     * 生成失败的结果
     * 1. 消息
     * 2. 数据
     *
     * @param message 消息
     * @param result  结果
     * @return {@link Result}
     */
    public static <T> Result<T> genFailureResult(String message, Result result) {
        return (Result<T>) Result.builder().message(message).data(result).build();
    }

    /**
     * 生成失败的结果
     * 1. 消息
     * 2. 状态码
     * 3. 详细错误信息
     *
     * @param message    消息
     * @param httpStatus 结果代码
     * @return {@link Result}
     */
    public static <T> Result<T> genFailureResult(String message, Integer httpStatus, T t) {
        return (Result<T>) Result.builder().message(message).code(httpStatus).data(t).build();
    }

    /**
     * 通过布尔运算生成结果
     *
     * @param resultFlag 结果标志
     * @return {@link Result}
     */
    public static <T> Result<T> genResult(Boolean resultFlag) {
        return resultFlag ? ResultGenerator.genSuccessResult() : ResultGenerator.genFailureResult();
    }

    public static <T> Result<T> genResult(Integer rows) {
        return rows > 0 ? ResultGenerator.genSuccessResult() : ResultGenerator.genFailureResult();
    }

    /**
     * 通用分页结果数据
     *
     * @param iPage 我页面
     * @return {@link R}<{@link PageData}<{@link T}>>
     */
    public static <T> Result<PageData<T>> genPage(IPage<T> iPage) {
        PageData<T> pageData = PageData.<T>builder()
                .pageSize(Convert.toInt(iPage.getSize()))
                .current(Convert.toInt(iPage.getCurrent()))
                .totalCount(iPage.getTotal())
                .data(iPage.getRecords())
                .build();
        return ResultGenerator.genSuccessResult(pageData);
    }
}